package jgl.vajra.driver.part.web;

/**
 * Android/Java版本比较工具
 * 支持格式如"1.1.1"和"1.0.0"的版本号比较
 * 通过移除点号后进行数值比较，并提供自动补位功能
 */
public class VersionComparator {

    /**
     * 比较两个版本号的大小
     *
     * @param version1 第一个版本号
     * @param version2 第二个版本号
     * @return 如果version1 > version2返回1；如果version1 < version2返回-1；如果相等返回0
     * @throws IllegalArgumentException 如果输入的版本号格式不合法
     */
    public static int compareVersions(String version1, String version2) {
        // 参数验证
        if (version1 == null || version2 == null) {
            throw new IllegalArgumentException("版本号不能为空");
        }

        // 移除所有点号
        String processedVersion1 = version1.replaceAll("\\.", "");
        String processedVersion2 = version2.replaceAll("\\.", "");

        // 验证处理后的版本号是否为纯数字
        if (!processedVersion1.matches("\\d+") || !processedVersion2.matches("\\d+")) {
            throw new IllegalArgumentException("版本号格式不合法，只能包含数字和点号");
        }

        // 获取两个版本号的长度
        int length1 = processedVersion1.length();
        int length2 = processedVersion2.length();

        // 计算需要补位的长度
        int maxLength = Math.max(length1, length2);

        // 自动补位，在较短的版本号后面补零
        String paddedVersion1 = padWithZeros(processedVersion1, maxLength);
        String paddedVersion2 = padWithZeros(processedVersion2, maxLength);

        try {
            // 转换为BigInteger进行比较（支持非常长的版本号）
            java.math.BigInteger num1 = new java.math.BigInteger(paddedVersion1);
            java.math.BigInteger num2 = new java.math.BigInteger(paddedVersion2);

            return num1.compareTo(num2);
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("版本号转换为数字时出错", e);
        }
    }

    /**
     * 在字符串后面补零，使其达到指定长度
     *
     * @param str    原始字符串
     * @param length 目标长度
     * @return 补零后的字符串
     */
    private static String padWithZeros(String str, int length) {
        if (str == null || str.length() >= length) {
            return str;
        }

        StringBuilder sb = new StringBuilder(str);
        while (sb.length() < length) {
            sb.append('0');
        }
        return sb.toString();
    }

    /**
     * 比较两个版本号的大小，并返回友好的比较结果描述
     *
     * @param version1 第一个版本号
     * @param version2 第二个版本号
     * @return 比较结果描述字符串
     */
    public static boolean compareVersionsWithDescription(String version1, String version2) {
        int result = compareVersions(version1, version2);
        return result > 0;
    }
}

